package com.briup.day12;

public class Test3 {
    public static void main(String[] args) {
        String s = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        String s4 = new String("hello");
        String s5 = "hellohello";
        String s8 = "hello" + "hello";
        String s6 = s + s2;
        String s7 = s3 + s4;
        // 因为s和s2都是通过字面常量赋值的"hello"字符串，
        // 所以他们都是在字符串常量池中获取的同一个字符串对象
        System.out.println(s == s2); // true
        // 因为s3是通过new创建的字符串对象，会在堆区中新开辟空间，所以不是同一个对象
        System.out.println(s2 == s3); // false
        // s6是两个String变量进行拼接，会创建一个新的String对象，所以与字面常量不是一个对象
        System.out.println(s5 == s6); // false
        // 两个字面常量进行拼接，其结果是能够确定的，所以直接从字符串常量池中获取对象即可
        System.out.println(s5 == s8); //true

        // 在这一条语句中，共创建了几个对象 5个
        // 如果这条语句是第一条语句，那么会先根据new关键字在堆区创建出两个String类对象
        // 然后根据你在构造器中传入的字符串常量，会在方法区的字符串常量池中创建出这两个字符串常量对象
        // 两个字符串对象进行拼接，还会创建一个独立的字符串对象
        String s9 = new String("hello") + new String("world");
    }
}
